ssd1306(OLED)
准备
硬件:
- FireBeetle-ESP32 × 1
- FireBeetle Covers-OLED12864 Display模块 × 1 (点击查看模块详情)
软件:
- uPyCraft IDE
代码位置:
File → Examples → Display → ssd1306Demo.py
引用模块:uPy_lib → ssd1306.py
实验步骤
1. 硬件连接,如下图
2. 将 uPy_Lib 目录下的 ssd1306.py 下载到板子中,如下图
3. 运行 ssd1306Demo.py,具体代码如下
#硬件平台:FireBeetle-ESP32
from machine import Pin, I2C
import ssd1306
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)
lcd = ssd1306.SSD1306_I2C(128, 64, i2c)
lcd.text("DFRobot", 0, 0)
for i in range(0, 28):
lcd.pixel(2*i, 10, 1)
lcd.line(0, 12, 54, 12, 1) #画一条蓝色的线,起始坐标为(0,12),(54,12)
lcd.hline(10, 32, 108, 1) #画一条蓝色的水平线,起始点为(10,32),长度为108
lcd.vline(64, 0, 64, 1) #画一条蓝色的垂直线,起始点为(64,0),高度为64
lcd.fill_rect(59, 27, 10, 10, 1) #画一个矩形,填充蓝色,对角点坐标为(59,27),(10,10)
lcd.rect(56, 24, 16, 16, 1) #画一个蓝色矩形框,对角点坐标为(59,24),(16,16)
lcd.fill_rect(59, 27, 10, 10, 1)
lcd.fill_rect(88, 0, 40, 20, 1)
lcd.line(88, 0, 128, 20, 0) #画黑色线
lcd.line(88, 20, 128, 0, 0)
lcd.show() #显示
说明:
SSD1306目前只支持两种颜色,即蓝色(1)和黑色(0)。
实验效果
实验扩展
学了上面的例子,相信你也基本掌握了这个模块,现在我们来写一个程序,当文字碰到OLED屏边缘时自动反弹,同时文字改变。有兴趣的话,下载下来看看吧。当然,你也可以根据自己的需要来显示文字和设计自己的图形,甚至可以让你的图形动起来。另外要注意lcd.show()函数很重要,用来显示刷新文字和图形喔。
注意:
因为我们之前已经下载了 ssd1306.py,所以直接将下面的程序保存为.py文件运行即可。
#hardware platform: FireBeetle-ESP32
from machine import Pin,I2C
import ssd1306
import time
import machine
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)
lcd = ssd1306.SSD1306_I2C(128, 64, i2c)
x1,y1,x2,y2,x3,y3,x4,y4 = (4,4,50,64,0,0,0,0)
bufx,bufy = bytearray(300),bytearray(300)
str1,str2 = "OLED...","DFRobot"
i,k,corr = (0, 10, 3)
def getPoint(x, y):
global i, k, x4, y4
k = 0
if(x<3 or x>72):
k,x4,y4 = (1 if x<3 else 2),(3 if x<3 else 72),y
elif(y<3 or y>60):
k,y4,x4 = (3 if y<3 else 4),(3 if y<3 else 60),x
if not k:
bufx[i],bufy[i],i = x,y,i+1
return k
def DDALine(x1, y1, x2, y2):
if x1==x2 or y1==y2:
x2=x1+16*corr if x1<20 else x1-16*corr
if (y1<20 and x1<20) or (y1<20 and x1>20):
y2 = y1+8*corr
elif (y1>20 and x1<20) or (y1>20 and x1>20):
y2 = y1-8*corr
xerr,yerr,uRow,uCol,delta_x,delta_y = 0,0,x1,y1,x2-x1,y2-y1
if(delta_x >= 0):
incx=1 if delta_x>0 else 0
else:
incx,delta_x = -1,-delta_x
if(delta_y >= 0):
incy=1 if delta_y>0 else 0
else:
incy,delta_y = -1,-delta_y
distance=delta_x if delta_x>delta_y else delta_y
for t in range(0, distance+2):
if(getPoint(uRow, uCol)):
return
xerr += delta_x
yerr += delta_y
if(xerr > distance):
xerr -= distance
uRow += incx
if(yerr > distance):
yerr -= distance
uCol += incy
def show(s):
global i
for j in range(0,i//2):
lcd.fill(0)
lcd.text(s, bufx[j*2]-3,bufy[j*2]-3)
lcd.show()
i=0
try:
DDALine(x1, y1, x2, y2)
while 1:
if(k == 0):
x1,y1,x3,y3,x2,y2 = x2,y2,x4,y4,2*x2-x4,2*y2-y4
DDALine(x1,y1,x2,y2)
x1,y1 = x3,y3
elif(k < 3):
show(str2)
x1,y1,x2,y2 = x4,y4,x1,2*y4-y1
if(abs(y1-y2)<8*corr or abs(y1-y2)>12*corr):
y2=y1-8*corr if y1>=y2 else y1+8*corr
DDALine(x1, y1, x2, y2)
else:
show(str1)
x1,y1,x2,y2 = x4,y4,2*x4-x1,y1
if(abs(x1-x2)>16*corr or abs(x1-x2)<8*corr):
x2=x1-16*corr if x1>=x2 else x1+16*corr
DDALine(x1, y1, x2, y2)
except:
machine.reset()
ssd1306.py库API说明
*在程序中涉及到类的继承,所谓继承就是当一个类A继承另一个类B后,类A就拥有类B的所有属性。我们将被继承的类B叫父类,将继承的类A叫子类。ssd1306库中的类SSD1306_I2C和类SSD1306_SPI就是类SSD1306的子类。
类 — SSD1306
- class SSD1306(width, height, external_vcc)
width:SSD1306屏幕分辨率的宽度,为128
height:SSD1306屏幕分辨率的高度,为64
external_vcc:是否外部供电
True、False
类函数
- fill(col) 函数功能:用颜色填充屏幕。
col:颜色
- pixel(x, y, col) 函数功能:画点。
x, y:点坐标(x, y)
col :颜色
- scroll(dx, dy) 函数功能:按照给定的向量(dx,dy)移动屏幕中的内容。
注意:
这可能会在屏幕上留下以前颜色的占位面积。
dx:水平方向移动的距离和方向
dx为正数时向右移动,为负数时向左移动
dy:垂直方向移动的距离和方向
dy为正数时向下移动,为负数时向下移动
- text(string, x, y, col=1) 函数功能:显示字符串。
string:待显示的字符串
x, y :显示的坐标(x, y)
col :颜色,默认为1(蓝色)
- hline(x, y, w, col) 函数功能:画水平线。
x, y:水平线起点的坐标(x, y)
w :水平线的宽度
col :颜色
- vline(x, y, h, col) 函数功能:画垂直线。
x, y:垂直线起点的坐标(x, y)
h :垂直线的高度
col :颜色
- rect(x, y, w, h, col) 函数说明:画矩形框。
x, y:矩形框左上角点的坐标(x, y)
w :宽度
h :高度
col :颜色
- fill_rect(x, y, w, h, col) 函数功能:画矩形,并用颜色填充。
x, y:矩形左上角点的坐标(x, y)
w :宽度
h :长度
col :颜色
- blit(fbuf, x, y) 函数功能: 使用framebuffer在屏幕上开辟一块可编辑区域,这块区域具有fill()、 pixel()、scroll()、text()、hline()、vline()、line()、rect()、fill_rect()、 blit()函数的功能。
fbuf:FrameBuffer对象
x, y:FrameBuffer对象坐标(x, y)
示例:
from machine import Pin, I2C
import framebuf
import ssd1306
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)
lcd = ssd1306.SSD1306_I2C(128, 64, i2c)
buffer = bytearray(56 * 8 // 8) #开辟56*8像素空间
framebufnew = framebuf.FrameBuffer(buffer, 56, 8, framebuf.MVLSB) #创建新的framebuffer对象
framebufnew.text("DFRobot", 0, 0) #新的framebuffer输入字符串
lcd.blit(framebufnew, 0, 17) #新的frambuffer起始坐标
lcd.show()
类 — SSD1306_I2C
- class SSD1306.SSD1306(width, height, i2c, addr=0x3c, external_vcc=False)
width:屏幕宽度
height:屏幕高度
i2c:I2C对象
addr:I2C地址(默认地址为0x3c)
external_vcc:是否外部供电(默认否)
类 — SSD1306_SPI
- class SSD1306.SSD1306_SPI(width, height, spi, dc, res, cs, external_vcc=False)
width:屏幕宽度
height:屏幕高度
spi:SPI对象
dc:data/cmd选择信号线
res:硬件复位信号线
cs:SPI片选信号线
external_vcc:是否外部供电(默认否)